﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using LayerData;
using LayerData.Producto;
using LayerEntity.Producto;
using LayerEntity.Sistema;

namespace LayerLogic.Producto
{
    public class LProducto
    {
        #region Variables
        public delegate void AddObject(string msj, EnumOperaciones op, EnumEstadoOperaciones est);
        public event AddObject UpdateList = delegate { };
        readonly IPostgreSqlConnectionInfo connectionInfo;
        readonly DProducto common;
        List<EListaPrecios> listarListaPrecios;
        List<EGrupo> listarGrupos;
        #endregion
      
        #region Constructores
        public LProducto()
        {
            this.InicializaVariables();
            this.connectionInfo = ObjectFactory.CreateConnectionInfo();
            this.common = new DProducto(this.connectionInfo);
        }

        public LProducto(IPostgreSqlConnectionInfo connection)
        {
            this.InicializaVariables();
            this.connectionInfo = connection;
            this.common = new DProducto(connection);
        }

        #endregion
        #region Metodos Privados
        private void InicializaVariables()
        {
            this.listarListaPrecios = new List<EListaPrecios>();
            this.listarGrupos = new List<EGrupo>();
        }

        #endregion

        #region MANTENIMIENOS
        public string MantenimientoPrecios(EPrecios precio, EnumOperaciones op)
        {
            return this.common.MantenimientoPrecios(precio, (LayerData.EnumOperaciones)((int)op));
        }

        public string MantenimientoProductos(EProducto producto, EPrecios precio, EnumOperaciones op)
        {
            return this.common.MantenimientoProductos(producto, precio, (LayerData.EnumOperaciones)((int)op));
        }

        public string MantenimientoGrupos(EGrupo grupo, EnumOperaciones op)
        {
            return this.common.MantenimientoGrupos(grupo, (LayerData.EnumOperaciones)((int)op));
        }

        public string MantenimientoFamilias(EFamilia familia, EnumOperaciones op)
        {
            return this.common.MantenimientoFamilias(familia, (LayerData.EnumOperaciones)((int)op));
        }

        public string MantenimientoUnidades(EUnimed unidad, EnumOperaciones op)
        {
            return this.common.MantenimientoUnidades(unidad, (LayerData.EnumOperaciones)((int)op));
        }

        #endregion
        #region RecordManagerProducto
        public List<EListaPrecios> GetListaPrecios()
        {
            if (this.listarListaPrecios.Count == 0)
            {
                this.listarListaPrecios = this.common.GetListaPrecios();
            }
            return this.listarListaPrecios;
        }

        public DataTable GetListaGrupo(EGrupo obj)
        {
            return this.common.GetListaGrupo(obj);
        }

        public DataTable GetListaFamilia(EFamilia obj)
        {
            return this.common.GetListaFamilia(obj);
        }

        public DataTable GetListaUnidad(EUnimed obj)
        {
            return this.common.GetListaUnidad(obj);
        }

        public DataTable GetListaProductos(EProducto obj)
        {
            return this.common.GetListaProductos(obj);
        }

        public DataTable GetListaPrecios(EPrecios obj)
        {
            return this.common.GetListaPrecios(obj);
        }

        public DataTable GetListaGeneralProductos(EProducto obj)
        {
            return this.common.GetListaGeneralProductos(obj);
        }

        public DataTable GetListaGeneralPrecios(EPrecios obj)
        {
            return this.common.GetListaGeneralPrecios(obj);
        }
        public DataTable GetListadoProducto(ESistema obj)
        {
            return this.common.GetListadoProducto(obj);
        }
        public void AddGrupo(EGrupo doc)
        {
            if (doc != null)
            {
                this.UpdateList("Se Agrego un Nuevo Documento", EnumOperaciones.AddCollection, EnumEstadoOperaciones.Complete);
                int index = this.listarGrupos.FindIndex(delegate(EGrupo docSerach)
                {
                    return doc.Id_Grupo == docSerach.Id_Grupo;
                });

                if (index > -1)
                {
                    this.listarGrupos[index] = doc;
                }
                else
                {
                    this.listarGrupos.Add(doc);
                }
            }
            else
            {
                this.UpdateList("Parametro es Null", EnumOperaciones.AddCollection, EnumEstadoOperaciones.Error);
            }
        }
        #endregion

        public List<EProducto> GetProductos() {
            return this.common.GetProductos();
        }

        public EProducto GetProducto(string codigo) {
            return common.GetProducto(codigo);
        }
    }
}